Slack App を Socket Mode でつくって Heroku で動かす
2021-01-31 時点での記録。
ごあいさつ
Slack App の Socket Mode ってやつに興味があって試してみた。
Intro to Socket Mode | Slack
Socket to me. Build custom Slack integrations… | by Jim Ray | Slack Platform Blog | Jan, 2021 | Medium
Slack ソケットモードの最も簡単な始め方 - Qiita
ほいで、ちょっと欲張る気持ちがあって、同じように興味があった Slack Workflow に自作の Step を追加するのも試してみた。二兎を追うが二兎とも得るぞ!
Workflow Builder: Steps from apps | Slack
A step in the right direction. Introducing a new way to extend your… | by Adam Marinelli | Slack Platform Blog | Medium
Slackのworkflowでgithubにissueを作成する独自stepを追加する
できあがったものは Heroku で動かせるとぼくにとっては楽なので、開発環境である手元の macOS と本番環境となる Heroku の両方でいい感じに動くアプリケーションを目指して作業を進めた。調べてみると、Slack が提供している Bolt という JavaScript のフレームワークを使うのが簡単そうだったので、ついでに Bolt の使い方も覚えることにした。三兎を追って三兎を得る作戦。心配。
Slack | Bolt for JavaScript
https://github.com/slackapi/bolt-js
hr.icon
できあがったサンプル
「GitHub の指定のリポジトリに Issue を立てる」という Slack Workflow の Step を実装した。
https://github.com/june29/slack-workflow-creating-github-issue-sample
https://gyazo.com/186f03a7167afb04104ba60d609dcdce
Workflow Builder に自作の Step が登録されていて選択できる様子
https://gyazo.com/77e47dda538081e86b16aca8c7b0e8e6
おつかれシャワーへのおたよりを投稿するフォームを開き、それを GitHub の Issue に起こすという Workflow の例
https://gyazo.com/5652730594e8453e55f659a5e4100aaf
フォームに入力された内容を変数として使いながら、Issue のタイトルと概要文を組み立てることができる
https://gyazo.com/ee9879683997233656e8cd81b34ccb5f
実際に Workflow を起動してフォームに情報を入力して Submit すると
https://gyazo.com/b03d2d5f7c4c7cf48194fecca8c13deb
このように Issue が作成される
hr.icon
作業メモ
https://gyazo.com/65558b633fc4e41a9a01a7a5e1f1edc5
Socket Mode は本当に楽
手元で起動したアプリケーションがそのまま Slack とやりとりしてくれるので、開発環境の準備がとても楽
実運用にあたっては「本番用 Slack App」と「開発用 Slack App」と、設定内容を揃えたふたつの Slack App を登録して活用するとよいだろう
環境変数とかで Bot Token と App Token を切り替えて環境を分離すればやっていけそう、という開発プロセスのイメージがついた
Heroku も WebSocket に対応している
なので、特になにも考えなくてもデプロイしたら動く
WebSockets on Heroku | Heroku Dev Center
ただ、Heroku で「これは Web Server です」と認識されると、起動から 60 秒以内に環境変数 PORT で指定される番号のポートを listen しないと R10 - Boot timeout というエラーが発生してアプリケーションが終了してしまう
https://devcenter.heroku.com/articles/runtime-principles#web-servers
https://devcenter.heroku.com/articles/error-codes#r10-boot-timeout
今回のサンプル実装では Procfile で「これは websocket のプロセスですよ〜」と明示してやった
https://github.com/june29/slack-workflow-creating-github-issue-sample/blob/main/Procfile
フレームワークの Bolt はよくできていて、ドキュメントも充実しているし、Slack と連携するなにかをつくるときはこれを活用していくと捗ると思う
Slack とのやりとりの部分はフレームワークにおまかせして、実現したい処理に集中できると感じた